package main

import (
	"fmt"
	"errors"
)

// 使用数组来模拟栈的使用
type Stack struct {
	MaxTop int // 栈顶最大值
	Top int // 表示栈顶
	arr [5]int // 数组模拟栈
}

func (this *Stack) Push(val int) (err error) {
	// 先判断栈是否已满
	if this.Top == this.MaxTop - 1 {
		fmt.Println("栈满了")
		return errors.New("stack full")
	}

	this.Top++
	// 放入数据
	this.arr[this.Top] = val
	return

}

// 遍历栈，需要从栈顶开始遍历
func (this *Stack) List() {
	// 先判断栈是否为空
	if this.Top == -1 {
		fmt.Println("stack empty")
		return
	}
	// curTop := this.Top
	fmt.Println("栈的情况如下")
	for i := this.Top; i >= 0; i-- {
		fmt.Printf("arr[%d]=%d\n", i, this.arr[i])
	}
}

// 出栈
func (this *Stack) Pop() (val int, err error) {
	// 判断栈是否为空
	if this.Top == -1 {
		fmt.Println("栈空")
		return 0, errors.New("stack empty")
	}
	// 先取值，再 this.Top--
	val = this.arr[this.Top]
	this.Top--
	return val, nil
}

func main() {

	stack := Stack {
		MaxTop: 5,
		Top: -1, // 当栈顶为-1时表示栈为空
	}

	// 入栈
	stack.Push(1)
	stack.Push(2)
	stack.Push(3)
	stack.Push(4)
	stack.Push(5)
	stack.List()
	stack.Push(6) // 栈满
	val, err := stack.Pop()
	if err != nil {
		fmt.Println("栈已空")
	} else {
		fmt.Println("弹出", val)
	}
}